using System;
using UnityEngine;

namespace Galplay {

  public enum ScriptType {
    Comment, // 注释或无法识别的类型。没有任何作用。
    Picture, // 显示图片
    Clear, // 清除一个指定Slot图片。
    BG, // 改变背景图片
    Wait, // 暂停处理指定的帧数
    Text, // 输出剧情文本（带语音）
    Command, // 指定一个给定的系统指令
    Event, // 从Event中调取一系列脚本执行（相当于宏）
    BGM, // 播放背景音乐
    BGS, // 播放背景音效
    SE, // 播放一个声音文件
    Tint, // 屏幕的闪光效果
  }

  public abstract class GalScript {
    public GalScene Owner { get; }

    protected GameManager GM { get => GameManager.Instance; }

    // 此脚本的IndexID（即行数，不是连续的）
    public int IndexID { get; }
    // 此脚本的Index（在数组中的位置，都是连续的）
    public int Index { get; set; }
    // 此脚本的类型
    public ScriptType Type { get; }
    // 标志是否执行到这个脚本的时候，就需要断点，然后让用户进行操作
    public virtual bool IsBreakPoint { get => false; }

    public GalScript(GalScene owner, XmlNode node, ScriptType type) {
      this.Owner = owner;
      IndexID = node.GetInt("Index");
      Type = type;
    }

    public static ScriptType GetScriptTypeByName(string name) {
      // 处理空或空白名称
      if (string.IsNullOrWhiteSpace(name)) {
        return ScriptType.Comment;
      }

      // 标准化名称：去除空白、统一大小写
      string normalizedInput = name.Trim().ToLowerInvariant();

      try {
        // 尝试直接解析枚举值（处理标准命名）
        if (Enum.TryParse<ScriptType>(name, true, out var result)) {
          return result;
        }
      } catch {
        // 捕获任何可能的异常（如枚举解析错误）
      }

      // 默认返回Commet
      return ScriptType.Comment;
    }

    public static int ParseInt(string str, int default_value = 0) {
      if (int.TryParse(str, out var result)) {
        return result;
      }
      return default_value;
    }

    public abstract void Execute(GameScenePlayer player);

    public float FrameToTime(int frame) {
      return frame * Time.fixedDeltaTime;
    }

    public float AutoFrameToTime(GameScenePlayer player, int frame) {
      if (player.IsSkipMode) {
        return frame * Time.fixedDeltaTime * player.skipFlashRate;
      }else{
        return frame * Time.fixedDeltaTime;
      }

    }
  }
}
